package gui;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import gestionBDD.accesBDD;
import gestionBDD.extractionBDD;
import gestionBDD.requetesAlbum;
import gestionBDD.requetesCommande;
import gestionBDD.requetesLigneCommande;
import gestionBDD.requetesTirage;
import interne.Album;
import interne.Client;
import interne.Commande;
import interne.Contient;
import interne.LigneCommande;
import interne.Tirage;

import com.trolltech.qt.gui.*;

public class fenetreCommande extends QWidget {
	
	protected Client client ;
	protected Commande commande ;
	protected Savepoint save ;
	
	protected Float montant ;
	
	protected QListWidget albumListWidget;
	protected QListWidget contientListWidget;
	protected QComboBox tirageComboBox ;
	protected QListWidget panierListWidget;
	protected QLineEdit quantiteLineEdit;

	/**
	 * Construit la fenêtre Commande
	 * @param commmande
	 * @param client
	 * @param savepoint
	 * @throws SQLException
	 */
	public fenetreCommande(Commande comm, Client cli, Savepoint save) throws SQLException {
		
		this.save = save ;
		setCommande(comm);
		setClient(cli) ;

		System.out.println(commande.getReference());
		
		
		albumListWidget = new QListWidget();
		albumListWidget.currentItemChanged.connect(this, "afficherContenu()");
		
		contientListWidget = new QListWidget();
		contientListWidget.currentItemChanged.connect(this, "adapterTirage()") ;
		
		panierListWidget = new QListWidget();

        /** Login's GroupBox' **/
        QGroupBox albumsGroup = new QGroupBox(tr("Albums disponibles"));
        QHBoxLayout albumsLayout = new QHBoxLayout();
        albumsLayout.addWidget(albumListWidget);
        albumsLayout.addWidget(contientListWidget);
        albumsGroup.setLayout(albumsLayout);


        
        /** Login's GroupBox' **/
        QGroupBox ajoutGroup = new QGroupBox(tr("Sélection"));
        /* Bouton Connexion */
        QPushButton boutonAjouterPanier = new QPushButton("Ajouter");
        boutonAjouterPanier.clicked.connect(this, "ajouterPanier()");  

        /* Choix Format ComboBox */
        tirageComboBox = new QComboBox() ;
        tirageComboBox.setFixedWidth(150);
        
        /* Quantité Edit with Label */
        QLabel quantiteLabel = new QLabel(tr("Quantité :"));
        quantiteLineEdit = new QLineEdit();
        quantiteLineEdit.setFixedWidth(80);
       
        /* Login's Layout */
        QGridLayout ajoutLayout = new QGridLayout();
        ajoutLayout.addWidget(tirageComboBox, 0, 0);
        ajoutLayout.addWidget(quantiteLabel, 0, 1);
        ajoutLayout.addWidget(quantiteLineEdit, 0, 2);
        ajoutLayout.addWidget(boutonAjouterPanier, 1, 2);
        ajoutGroup.setLayout(ajoutLayout); 

        /* Bouton Valider Panier */
        QPushButton boutonRetirerPanier = new QPushButton("Retirer");
        boutonRetirerPanier.clicked.connect(this, "retirerPanier()");       
       
        /* Bouton Valider Panier */
        QPushButton boutonValiderPanier = new QPushButton("Valider Panier");
        boutonValiderPanier.clicked.connect(this, "validerPanier()");       
 
        /* Bouton Valider Panier */
        QPushButton boutonAnnulerPanier = new QPushButton("Annuler Commande");
        boutonAnnulerPanier.clicked.connect(this, "annulerCommande()");        
        
        /** Login's GroupBox' **/
        QGroupBox panierGroup = new QGroupBox(tr("Contenu du Panier"));
        QGridLayout panierLayout = new QGridLayout();
        panierLayout.addWidget(boutonRetirerPanier, 0, 0);
        panierLayout.addWidget(boutonValiderPanier, 1, 1);
        panierLayout.addWidget(boutonAnnulerPanier, 1, 0);
        panierGroup.setLayout(panierLayout);     
        

 
		// Dialog Layout
        QVBoxLayout layout = new QVBoxLayout();
        layout.addWidget(albumsGroup);
        layout.addWidget(ajoutGroup);
        layout.addWidget(panierListWidget);
        layout.addWidget(panierGroup);
      
        setLayout(layout);
        
		tirageComboBox.setCurrentIndex(0);
		tirageComboBox.setFixedWidth(180);

        
		List<Album> listeAlbum = new ArrayList<Album>(); 
		listeAlbum = extractionBDD.extraireAlbumsCommandables(client);
		Iterator<Album> ite = listeAlbum.iterator();
		while (ite.hasNext()) {
		    Album album = ite.next();
		    albumListWidget.addItem(album.getTitreAlbum() + " / " + album.getIdAlbum()) ;
		}
		
		List<LigneCommande> listeLignesCommandes = new ArrayList<LigneCommande>(); 
		listeLignesCommandes = extractionBDD.extraireLignesCommandes(commande);
		Iterator<LigneCommande> ite2 = listeLignesCommandes.iterator();
		while (ite2.hasNext()) {
			LigneCommande lc = ite2.next();
		    panierListWidget.addItem(lc.getIdLigne() + " / Format : " + requetesTirage.retournerLibelle(lc.getIdFormat()) +" * "+lc.getQuantite()+" = "+lc.getMontant()) ;
		}		

	}
	
	/**
	 * Génère le contenu d'un album dans le volet de droite
	 * @throws SQLException
	 */
	public void afficherContenu() throws SQLException {
		contientListWidget.clear();
		contientListWidget.addItem("Tout l'album/livre");		

		String temp[] = albumListWidget.currentItem().text().split(" / ") ;
		Integer idAlbum = Integer.parseInt(temp[1]) ;
		Album album = new Album(idAlbum) ;
		album = requetesAlbum.trouverAvecIdAlbum(album) ;

		List<Contient> listePhoto = new ArrayList<Contient>();
		listePhoto = extractionBDD.extrairePhotos(album);
		Iterator<Contient> ite = listePhoto.iterator();
		
		while (ite.hasNext()) {
		    Contient photo = ite.next();
		    contientListWidget.addItem(photo.getOrdre()+ " : " + photo.getTitreImage()) ;
		}
	}
	
	/**
	 * En fonction de l'item sélectionné dans le volet de droite, les choix des tirages sont adaptés entre photo/album
	 */
	public void adapterTirage() throws SQLException {
		tirageComboBox.clear();
		List<Tirage> listeTirages = new ArrayList<Tirage>(); 
		listeTirages = extractionBDD.extraireTirages();
		Iterator<Tirage> ite = listeTirages.iterator();
		Boolean estAlbum = false ;
		if (contientListWidget.currentItem().text().equals("Tout l'album/livre")) estAlbum = true ;
		while (ite.hasNext()) {
		    Tirage tirage = ite.next();
		    if (tirage.getLibelle().startsWith("Photo") && estAlbum == false)
		    	tirageComboBox.insertItem(0, tirage.getIdFormat() + " : " + tirage.getLibelle() + " = "+ tirage.getPrixUnitaire()) ;
		    else if (!(tirage.getLibelle().startsWith("Photo")) && estAlbum == true)
		    	tirageComboBox.insertItem(0, tirage.getIdFormat() + " : " + tirage.getLibelle() + " = "+ tirage.getPrixUnitaire()) ;
		}
	}
	
	/**
	 * Ajoute l'item sélectionné dans le panier
	 * @throws SQLException
	 */
	public void ajouterPanier() throws SQLException {
		String idFormat = tirageComboBox.currentText();
		String temp[] = idFormat.split(" : ");
		idFormat = temp[0] ;
		temp = tirageComboBox.currentText().split(" = ") ;
		Float prixFormat = Float.parseFloat(temp[1]);
		String idAlbum = albumListWidget.currentItem().text() ;
		temp = idAlbum.split(" / " ) ;
		idAlbum = temp[1] ;
		Integer quantite = Integer.parseInt(quantiteLineEdit.text()) ;
		Float montantLigne = prixFormat*quantite;
		LigneCommande lc = new LigneCommande(commande.getReference(), Integer.parseInt(idFormat),  Integer.parseInt(idAlbum), quantite, montantLigne);
		requetesLigneCommande.ajouterLigneCommande(lc);
		reactualiser();
	}
	
	/**
	 * Supprime une ligne commande du panier en cours
	 * @throws SQLException
	 */
	public void retirerPanier() throws SQLException {
		String idFormat = panierListWidget.currentItem().text();
		String temp[] = idFormat.split(" / ");
		idFormat = temp[0] ;
		LigneCommande lc = new LigneCommande(Integer.parseInt(idFormat));
		requetesLigneCommande.retirerLigneCommande(lc);
		reactualiser();
	}

	/**
	 * Valide le panier, accède à l'écran coordonnées d'expédition
	 * @throws SQLException
	 */
	public void validerPanier() throws SQLException {
		
		Float montantTotal = requetesCommande.trouverMontant(commande);
		commande.setMontantTotal(montantTotal);
		requetesCommande.updateCommande(commande) ;
		
		Connection connexion = accesBDD.getInstance();
		connexion.commit();
		
        fenetreExpedition fenetre = new fenetreExpedition(commande);
		QMainWindow menuPrincipal = (QMainWindow) this.parentWidget() ;
		menuPrincipal.setCentralWidget(fenetre) ;

	}
	
	/**
	 * Annule la commande en cours (rollback)
	 * Retour à l'espace client
	 * @throws SQLException
	 */
	public void annulerCommande() throws SQLException {
		accesBDD.getInstance().rollback(save);
        fenetreClient fenetre = new fenetreClient(client);
		QMainWindow menuPrincipal = (QMainWindow) this.parentWidget() ;
		menuPrincipal.setCentralWidget(fenetre) ;
	}
		
	/**
	 * Réactualise l'écran en cours
	 * @throws SQLException
	 */
	public void reactualiser() throws SQLException {
        fenetreCommande fenetre = new fenetreCommande(commande, client, save);
		QMainWindow menuPrincipal = (QMainWindow) this.parentWidget() ;
		menuPrincipal.setCentralWidget(fenetre) ;
	}
	
	public Float getMontant() {
		return montant;
	}

	public void setMontant(Float montant) {
		this.montant = montant;
	}

	public Client getClient() {
		return client;
	}

	public void setClient(Client client) {
		this.client = client;
	}

	public Commande getCommande() {
		return commande;
	}

	public void setCommande(Commande commande) {
		this.commande = commande;
	}
	
}
